package com.mfz.common.definition.organization

import com.mfz.common.definition.Entity
import com.mfz.common.definition.log

typealias GetUserFunction = (userId: Int) -> User?

/**
 * 使用此方法,设置获得用户对象的方法,默认使用从数据库获得的方法
 */
fun setUserFunction(function: GetUserFunction) {
	getUserById = function
}

/**
 * 通过此方法获得一个用户的对象,
 * 实现时通过设置此变量的值来得到一个用户对象
 */
var getUserById: GetUserFunction = fun(userId: Int): User? {
	log.error("此方法为默认的,无效的方法,正常应该不使用getUserByIdDefault($userId)此方法.")
	return null
}

/**
 *
 * 用户的接口对象，此接口应该仅处理用户相关的信息
 *
 * create by 2019-06-19.
 * @author yimin
 */
interface User : Entity {

	/**
	 * 当所对象所属的企业对象
	 */
	val ownerCompany: Company
	/**
	 * 当前用户侧使用的密钥,在需要使用加密进行通讯时使用
	 */
	val encryptionKey: String

	/**
	 * 返回当前人所属主要部门
	 */
	val department: Department
	/**
	 * 返回当前人所属的所有部门
	 */
	val departments: Collection<Department>

	/**
	 * 返回当前人所对应的企业
	 */
	val companys: Collection<Company>
	/**
	 * 得到角色列表
	 */
	val roles: Collection<Role>

	/**
	 * 返回当前用户是否超人
	 */
	val isSupperMan: Boolean

	/**
	 * 下级所有人员
	 */
	val users: Collection<User>

	/**
	 * 上级对应的人
	 */
	val superior: User?

	/**
	 * 用户的登录操作，返回密码是否正确，是否允许登录
	 */
	fun login(password: String): Boolean

	/**
	 * 返回当前用户是否具体操作此功能的权限
	 * actionId：需要操作的功能的ID
	 */
	fun hasPermission(actionId: Int): Boolean

	/**
	 * 返回当前用户可用的菜单。
	 */
	fun getMenu(): String

	/**
	 * 增加一个操作权限组
	 */
	fun setRole(roleIds: Collection<Int>): Boolean

}



